//创建用户相关的小仓库
// 导入token方法
import { getToken, setToken, removeToken } from '@/utils/Cookie'
// 导入pinia库中的defineStore方法
import { defineStore } from 'pinia'
// 导入tagsView小仓库
import useTagsViewStore from './tagsView'
// 导入user相关的api
import { login, register, getInfo } from '@/api/user'
// 导入路由相关的常量和异步路由
import { constantRoute, asnycRoute } from '@/router/routes'
// 导入lodash中的cloneDeep方法
import cloneDeep from 'lodash/cloneDeep'
// 导入router和resetRouter
import router, { resetRouter } from '@/router'

//创建权限对应表
const ROLES = ['edit', 'admin']
// 校验用户是否拥有权限访问特定路由
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some((role) => route.meta.roles.includes(role))
  } else {
    return true
  }
}
// 用于过滤当前用户需要展示的异步路由
function filterAsyncRoute(asnycRoute, roles) {
  return asnycRoute.filter((route) => {
    if (hasPermission(roles, route)) {
      if (route.children && route.children.length > 0) {
        route.children = filterAsyncRoute(route.children, roles)
      }
      return true
    }
  })
}
// 获取默认的state状态
const getDefaultState = () => {
  return {
    token: getToken(), // 用户唯一标识token
    username: null,
    roles: [],
    menuRoutes: constantRoute // 仓库存储生成菜单需要数组(路由)
  }
}
// 创建用户小仓库
const useUserStore = defineStore('User', {
  // 小仓库存储数据地方
  state: () => {
    return getDefaultState()
  },
  // 异步|逻辑的地方
  actions: {
    // 用户登录的方法
    async userLogin(userInfo) {
      const { username, password } = userInfo
      const postUserInfo = { username, password }
      // 登录请求
      try {
        const res = await login(postUserInfo)
        if (res.code === 20000) {
          this.token = res.data
          setToken(res.data)
          this.username = username
        }
        return res.code
      } catch (error) {
        console.log('error: ', error)
        return Promise.reject(new Error(error))
      }
    },
    // 用户注册方法
    async userRegister(userInfo) {
      const { username, password } = userInfo
      const postUserInfo = { username: username.trim(), password }
      // 注册请求
      try {
        console.log(postUserInfo)
        const res = await register(postUserInfo)
        console.log(res)
        this.token = res.data
        setToken(res.token)
        router.push('/dashboard')
        return '注册成功'
      } catch (error) {
        console.log('error: ', error)
        return Promise.reject(new Error(error))
      }
    },
    // 获取用户信息方法
    async userInfo() {
      try {
        const { data } = await getInfo()
        const { role, username } = data
        this.roles = [ROLES[role]]
        this.username = username
        // 计算当前用户需要展示的异步路由
        const userAsyncRoute = filterAsyncRoute(cloneDeep(asnycRoute), this.roles)
        // 菜单需要的数据整理完毕
        this.menuRoutes = [...constantRoute, ...userAsyncRoute]
        console.log(this.menuRoutes)
        // 目前路由器管理的只有常量路由:用户计算完毕异步路由、任意路由动态追加
        ;[...userAsyncRoute].forEach((route) => {
          router.addRoute(route)
        })
      } catch (error) {
        return Promise.reject(new Error(error))
      }
    },
    // 退出登录
    userLogout() {
      const useStore = useTagsViewStore()
      return new Promise((resolve) => {
        const state = getDefaultState()
        this.token = null
        this.username = null
        this.roles = []
        this.menuRoutes = state.menuRoutes
        useStore.removeAllTagsView() // 清空tagsView数据
        removeToken()
        resetRouter() // 重置路由
        router.push('/login') // 导航到登录页面
        resolve()
      })
    }
  }
})
// 对外暴露获取小仓库方法
export default useUserStore
